# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#============================================================================
# Copyright (C) 2005 Mike Wray <mike.wray@hp.com>
+# Copyright (C) 2006 XenSource Ltd.
#============================================================================
+
import threading
import string
from xen.xend.XendError import XendError
import http
+import unix
from resource import Resource, ErrorPage
from SrvDir import SrvDir
closed = False
- def __init__(self, interface='', port=8080, root=None):
- if root is None:
- root = SrvDir()
+ def __init__(self, root, interface, port=8080):
+ self.root = root
self.interface = interface
self.port = port
- self.root = root
# ready indicates when we are ready to begin accept connections
# it should be set after a successful bind
self.ready = False
- def getRoot(self):
- return self.root
-
- def getPort(self):
- return self.port
-
def run(self):
self.bind()
self.listen()
self.ready = True
- self.requestLoop()
+
+ while not self.closed:
+ (sock, addr) = self.accept()
+ self.processRequest(sock, addr)
+
def stop(self):
self.close()
+
def bind(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
def accept(self):
return self.socket.accept()
- def requestLoop(self):
- while not self.closed:
- self.acceptRequest()
-
def close(self):
self.closed = True
try:
except:
pass
- def acceptRequest(self):
- try:
- (sock, addr) = self.accept()
- self.processRequest(sock, addr)
- except socket.error:
- return
-
def processRequest(self, sock, addr):
try:
rp = RequestProcessor(self, sock, addr)
def getResource(self, req):
return self.root.getRequestResource(req)
+
class UnixHttpServer(HttpServer):
- def __init__(self, path=None, root=None):
- HttpServer.__init__(self, interface='localhost', root=root)
+ def __init__(self, root, path):
+ HttpServer.__init__(self, root, 'localhost')
self.path = path
def bind(self):
- pathdir = os.path.dirname(self.path)
- if not os.path.exists(pathdir):
- os.makedirs(pathdir)
- else:
- try:
- os.unlink(self.path)
- except SystemExit:
- raise
- except Exception, ex:
- pass
- self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- #self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- self.socket.bind(self.path)
+ self.socket = unix.bind(self.path)
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#============================================================================
# Copyright (C) 2005 Mike Wray <mike.wray@hp.com>
-# Copyright (C) 2005 XenSource Ltd.
+# Copyright (C) 2005-2006 XenSource Ltd.
#============================================================================
-import socket
import os
import os.path
+import socket
+import stat
import connection
+def bind(path):
+ """Create a Unix socket, and bind it to the given path. The socket is
+created such that only the current user may access it."""
+
+ parent = os.path.dirname(path)
+ if os.path.exists(parent):
+ os.chown(parent, os.geteuid(), os.getegid())
+ os.chmod(parent, stat.S_IRWXU)
+ if os.path.exists(path):
+ os.unlink(path)
+ else:
+ os.makedirs(parent, stat.S_IRWXU)
+
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ sock.bind(self.path)
+ return sock
+
+
class UnixListener(connection.SocketListener):
def __init__(self, path, protocol_class):
self.path = path
def createSocket(self):
- pathdir = os.path.dirname(self.path)
- if not os.path.exists(pathdir):
- os.makedirs(pathdir)
- else:
- try:
- os.unlink(self.path)
- except SystemExit:
- raise
- except Exception, ex:
- pass
- sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- sock.bind(self.path)
- return sock
+ return bind(self.path)
def acceptConnection(self, sock, _):
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#============================================================================
# Copyright (C) 2004, 2005 Mike Wray <mike.wray@hp.com>
+# Copyright (C) 2006 XenSource Ltd.
#============================================================================
"""Example xend HTTP
root.putChild('xend', SrvRoot())
servers = XendServers()
if xroot.get_xend_http_server():
- port = xroot.get_xend_port()
- interface = xroot.get_xend_address()
- servers.add(HttpServer(root=root, interface=interface, port=port))
+ servers.add(HttpServer(root,
+ xroot.get_xend_address(),
+ xroot.get_xend_port()))
if xroot.get_xend_unix_server():
path = xroot.get_xend_unix_path()
log.info('unix path=' + path)
- servers.add(UnixHttpServer(path=path, root=root))
+ servers.add(UnixHttpServer(root, path))
return servers